在 Linux 是一個擁有強大網路功能的作業系統之一,有時候在我們進行問題排除、維護或檢測時會使用工具來確認網路是否如預期般的正確運作。
為了讓這些工作更加順利,Linux 提供了一系列專用的網路工具,這些工具各有其特點和用途。從基本的 ping
指令,用於測試網絡連接的穩定性,到更進階的 ethtool
,用於深入檢查和調整網絡接口設定,Linux 的網路工具可以幫助管理員更好地理解和管理系統的網路環境。
以下,我們將詳細介紹幾個常用的網路工具,包括它們的主要用途、使用範例和輸出概覽。
當然,以下是各個網路工具的使用範例、簡化的輸出,以及它們的主要用途和說明。
用於檢查與遠端主機的網路連接,在運作時我們使用 ping
傳送封包到目標主機,用來進行簡單的確認,它就像偵察兵一樣,讓管理員配出一個封包進行偵察以碓認目標狀況。
ping
使用 ICMP 封包進行測試,如果目標主機能夠接收與回覆,則發送端就能依這個回應得到下列的數據:
我們使用下列方式來測試連到 example.com
這個網路位置,因為在 Linux 中 ping
會一直不斷測試,所以我們加上 -c 4
參數代表測試 4 次就離開,然後 ping
會總結這 4 次的結果。
使用下列方式可以進行測試:
student$ sudo ping -c 4 example.com
結果如下:
PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=52 time=130 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=52 time=133 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=3 ttl=52 time=133 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=4 ttl=52 time=133 ms
--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 130.773/132.960/133.770/1.315 ms
由上列的輸出結果,可以看到 example.com
的 IP 為 93.184.216.34,且中間沒有遺失封包 (0% packet loss)。
因為 ping
使用 ICMP 封包進行傳送,有些防火牆不允許使用 ICMP 封包進行連線,這個時候 ping
就會失敗,因此使用 ping
無法直接證明目標主機是否正在運行,有時要配合其它工具來進一步確認。
在實務上如果是提供 web 的服務,但目標主機不允許 ICMP 封包的話,此時 ping
就會失敗,那麼我們就要使用如 curl
這類的網頁用戶端工具做進一步服務層級測試。
ss
是用來檢查 Linux 系統上的 socket 狀態的一個工具,也是 netstat
工具的替代品,所以在一些發行版上(如 Enterprise Linux 7 開始)在最小安裝時會發現沒有 netstat
可以使用。ss
提供了更多的選項和更快速的性能。當我們需要監控或調試網絡連接和狀態時,ss
是一個非常實用的工具。
ss
可以用來查詢多種不同類型的網路連接,包括 TCP、UDP、Unix socket 等。它也支持多種過濾選項,例如按照連接埠號 (Port)、狀態或網路協定來過濾。
常用的參中數如下:
-t
: 顯示 TCP socket。-u
: 顯示 UDP socket。-l
: 顯示正在監聽的 socket。-n
: 不解析服務名,直接顯示 IP 和 Port 號。-p
: 顯示行程資訊。我們可以透過下列方式,列出現在主機上有哪些開啟的連接埠:
student$ sudo ss -ntulp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=5351,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=5822,fd=13))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",pid=5351,fd=4))
tcp LISTEN 0 100 ::1:25 :::* users:(("master",pid=5822,fd=14))
透過上面輸出範例,我們可以得到主機的連接埠資訊:
tcp
,代表這是 TCP 連接。LISTEN
狀態表示 socket 正在等待來自遠端連接。*
表示綁定到所有的 IP 上。LISTEN
狀態,所以使用 *:*
或 :::*
表示它會接受任何遠端 IP 的連接。sshd
行程(PID 為 5351)在 Port 22 聆聽請求。在資訊安全議題上,系統管理人員需要知道主機有哪些連接埠是對外(開在非本機 IP)開放的,這個資訊有助於我們對外來威脅的掌握度。
在另一方面,由於網路服務需要使用連接埠來提供服務,所以也可以使用這個方法確認啟用的服務是否有在正確的 Port 上運作。
除了查詢本機開啟的 Port 之外,我們有時候也會需要瞭解主機本身和誰連線,或是誰來連主機,在這種情況下只要去除 -p
參數就可以了。
下列方式查出和主機正在以 TCP 與 UDP 連線的資訊:
$ sudo ss -ntu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 36 1.2.3.4:888 10.3.5.27:52658
tcp ESTAB 0 0 192.168.5.30:80 192.168.3.80:52667
tcp ESTAB 0 0 192.168.5.30:80 192.168.3.240:52668
從上輸出可以看到目前有 3 個連線,與來原端 IP(Peer Address)資訊。
host
是一個簡單的命令行工具,用於進行 DNS 查詢。它是 BIND 套件(Berkeley Internet Name Domain)的一部分,用於解析網路名稱。這個工具在日常系統管理和排解網路問題中是非常實用的。
在 Enterprise Linux 中,host
被收錄在 bind-utils
套件中,如果沒有這個指令則可以使用下列方式安裝:
student$ sudo dnf install -y bind-utils
在 bind-utils
中也包含了常用的 nslookup
與 dig
,但筆者認為在大部份的情境下只是需要確認名稱與 IP 是否對應正確,所以使用 host
指令更為直觀且方便。由於 DNS 問題排出已超出本書設定,所以在此僅介紹 host
指令應用。
以下為一般情境的查詢方式:
查出 example.com
的 IPv4 與 IPv6 記錄
student$ host example.com
輸出可能會顯示 example.com
的 A 記錄(IPv4 地址)和 AAAA 記錄(IPv6 地址)。
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
查詢 93.184.216.34
對應的名稱:
student$ host 93.184.216.34
顯示 IP 地址 93.184.216.34 相關的 PTR 記錄。
34.216.184.93.in-addr.arpa domain name pointer example.com.
由 IP 找出對應的完整名稱是 DNS 反解的流程,實務上並非所有 IP 都能查出其對應的主機名稱,所以有時候我們會得到 not found: 3(NXDOMAIN) 的字眼,代表這個 IP 沒有設定反向對應。
指定使用其它 DNS 主機查詢
有時候我們需要驗證自己的 DNS 主機是否正確運作,會和外部 DNS 的查詢結果做比對,此時只要在指令最後方設定指定的 DNS 主機就可以了。
下列示範使用 Google 的 8.8.8.8
公開 DNS 服務查詢 example.com
的結果:
student$ host example.com 8.8.8.8
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
traceroute
是一個用於檢查封包從一台電腦到目標電腦之間經過的節點網絡診斷工具。它可以用於識別網路延遲的來源、找出封包損失的地方,或是瞭解封包需要經過哪些中間節點才能到達目的地。
traceroute
用法很簡單,通常只要在後方加入要測試的目標主機名稱或 IP 就可以了,也可以透過下列幾個常用選項來做運用:
-I
: 使用 ICMP ECHO 請求而非預設的 UDP 或 TCP。-T
: 使用 TCP SYN 進行跟踪,這通常用於繞過防火牆。-p
: 指定要使用的連接埠號。-n
: 查詢結果只使用 IP 顯示。若我們需要從主機到 example.com
的節點資訊,並希望只顯示 IP 位置而不要反解,那麼可以使用用 -n
參數。
參考實做方式如下:
student$ sudo traceroute -n example.com
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
1 10.1.1.254 0.151 ms 0.164 ms 0.133 ms
2 15.62.X.Y 4.738 ms 4.704 ms 4.641 ms
3 168.34.A.B 12.276 ms 12.268 ms 12.235 ms
4 220.128.5.14 2.567 ms 220.128.5.42 2.256 ms 220.128.9.242 2.215 ms
5 220.128.9.126 2.222 ms 220.128.9.101 1.660 ms 220.128.9.126 2.155 ms
6 220.128.9.101 1.626 ms 202.39.91.69 130.675 ms 220.128.9.97 1.824 ms
7 202.39.91.69 130.652 ms 130.585 ms 62.115.162.86 130.849 ms
8 62.115.162.86 130.830 ms 130.983 ms 213.248.67.111 137.363 ms
9 213.248.67.111 137.355 ms 137.323 ms 137.283 ms
10 152.195.76.129 131.408 ms 93.184.216.34 130.682 ms 152.195.76.129 131.726 ms
11 93.184.216.34 130.779 ms 130.752 ms 130.767 ms
從輸出結果來看,我們可以判別要到 example.com
需要經過至少 10 個節點,這有助我們在做封包路徑的檢查,當然範例中的路徑不代表大家都是一樣的,依據使用者的網路提供者、區域等因素會有不同的路徑顯示。